///\todo upgrade

//////////////////////////////////////////////////////////////////////////////////
//                                                                              //
//  This file is part of the buola project (https://code.google.com/p/buola/).  //
//                                                                              //
//  Copyright(c) 2007-2012 Xavi Gratal                                          //
//  gratal AT gmail DOT com                                                     //
//                                                                              //
//  Buola is free software: you can redistribute it and/or modify               //
//  it under the terms of the GNU General Public License as published by        //
//  the Free Software Foundation, either version 3 of the License, or           //
//  (at your option) any later version.                                         //
//                                                                              //
//  Buola is distributed in the hope that it will be useful,                    //
//  but WITHOUT ANY WARRANTY; without even the implied warranty of              //
//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the               //
//  GNU General Public License for more details.                                //
//                                                                              //
//  You should have received a copy of the GNU General Public License           //
//  along with buola.  If not, see <http://www.gnu.org/licenses/>.              //
//                                                                              //
//////////////////////////////////////////////////////////////////////////////////

#ifndef _CDATABASE_H_
#define _CDATABASE_H_

#include <buola/io/curi.h>
#include <buola/db/detail/cdbimpl.h>

namespace buola {

class CDatabase
{
public:
    CDatabase() {}

    explicit CDatabase(const std::string &pEngine)
    {
        Create(pEngine);
    }

    CDatabase(const CDatabase &pO)
        :   mImpl(pO.mImpl)
    {}

public:

///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
//////////////////////////////// Interface ////////////////////////////////
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////

    void Create(const std::string &pEngine);

    void SetURI(const io::CURI &pURI)   {   mImpl->SetURI(pURI);    }
    void SetOption(const std::string &pKey,const UAny &pValue)    {   mImpl->SetOption(pKey,pValue);  }

    void Connect()      {   mImpl->Connect();       }
    void Disconnect()   {   mImpl->Disconnect();    }

    void Exec(const std::string &pQuery)    {   mImpl->Exec(pQuery);    }

	void Begin()       {   mImpl->Begin(); }
	void Commit()      {   mImpl->Commit();    }
	void RollBack()    {   mImpl->RollBack();  }

    int64_t GetLastInsertID()              {   return mImpl->GetLastInsertID();    }

	intrusive_ptr<detail::CDBImpl> GetImpl()     {   return mImpl;   }

private:
////////////////////////////////////////
////////////////////////////////////////
///////////////// DATA /////////////////
////////////////////////////////////////
////////////////////////////////////////
	intrusive_ptr<detail::CDBImpl> mImpl;
};

/*namespace buola*/ }

#endif
